package com.gitee.feizns.dynamic.io;

import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;


/**
 * 文件工具类
 * @author feizns
 * @since 2019/7/13
 */
public abstract class FileUtils {

    /**
     * 获取文件后缀（包含点）  hello.java -> .java   pic.jpg --> .jpg
     * @param filename 文件名
     * @return 文件后缀名
     */
    public static String suffix(String filename) {
        int index;
        return filename != null && (index = filename.lastIndexOf(".")) != -1
                ? filename.substring(index)
                : null;
    }

    /**
     * 将输入流的内容写入到file文件中
     */
    private static void write(InputStream is, File file) throws IOException {
        try ( FileOutputStream fos = new FileOutputStream(file) ) {
            Ios.transfer(is, fos);
        }
    }

    /**
     * <p>
     *     介于流只能使用一次，在将流进行复制多份之后，同时写入到多个文件
     * </p>
     */
    public static void write(InputStream is, File... files) throws IOException {
        InputStream[] streams = Ios.clone(is, files.length);
        for (int i = 0; i < files.length; i++) {
            //保证目录存在
            mkdir(files[i]);
            //写入数据
            write(streams[i], files[i]);
        }
    }

    /**
     * 创建一个文件所需的目录
     * <p>
     *     创建一个目录，如果需要创建目录的父目录不存在，则创建该目录所有的祖先级目录
     * </p>
     * @param file {@link File}
     * @return 是否有新创建（如果已经存在该目录也将返回false、即有没有操作创建这个操作）
     */
    public static boolean mkdir(File file) {
        return !file.exists() && (file.isDirectory() ? file : file.getParentFile()).mkdirs();
    }

    /**
     * 一个便捷的关闭多个流的方式
     * @param closeable {@link Closeable}
     */
    public static void close(Closeable... closeable) throws IOException {
        for (Closeable able : closeable)
            able.close();
    }

}
